#include "App.h"
#include "Buzzer.h"
#include "KEY.h"

/*
  默认按键配置：
  按键1 - 取消键 i = 1
  按键2 - 确认键 i = 2
  按键3 - +键 i = 3
  按键4 - -键 i = 4
*/

/* 主菜单界面按键控制 */
void main_menu_control(u8 i) {
  // 取消键
  if (i == 1 && menu_no != 0) {
    // 直接返回主界面
    menu_no = 0;
    os_send_signal(TASK_MENUS);
  }

  // 确认键
  else if (i == 2) {
    // 在主界面不做任何操作
    if (menu_no == 0) {
      return;
    }
    menu_level = 1;

    // 如果现在是闹钟主界面，进入闹钟设置
    if (menu_no == MENU_ALARM) {
      os_create_task(TASK_ALARM);
    }

    // 如果现在是倒计时主界面，进入倒计时
    else if (menu_no == MENU_COUNTDOWN) {
      os_create_task(TASK_COUNTDOWN);
    }

    // 如果现在是游戏主界面，进入游戏
    else if (menu_no == MENU_GAME) {
      os_create_task(TASK_GAME);
      os_create_task(TASK_BGM);
    }

    // 如果现在是计步器主界面，进入计步器
    else if (menu_no == MENU_PEDOMETER) {
      os_create_task(TASK_PEDOMETER);
    }

    // 如果现在是蓝牙主界面，进入蓝牙连接
    else if (menu_no == MENU_BLUETOOTH) {
      os_create_task(TASK_BLUETOOTH);
    }

    // 如果现在是温度度主界面，进入测量温湿度
    else if (menu_no == MENU_DHT) {
      os_create_task(TASK_DHT);
    }

    // 如果是设置时间主界面，进入设置时间
    else if (menu_no == MENU_SET_TIME) {
      os_create_task(TASK_SET_TIME);
    }

    // 如果是音乐界面，进入音乐播放界面
    else if (menu_no == MENU_MUSIC) {
      os_create_task(TASK_MUSIC_MENU);
    }

    os_delete_task(TASK_MENUS);
  }

  // +键 向下翻页
  else if (i == 3) {
    menu_no++;
    menu_no %= MENU_LEN;
    os_send_signal(TASK_MENUS);

    // -键 向上翻页
  } else if (i == 4) {
    if (menu_no == 0) {
      menu_no = MENU_LEN - 1;
    } else {
      menu_no--;
    }
    os_send_signal(TASK_MENUS);
  }
}

/* 闹钟一级子菜单界面按键控制 */
void alarm_control_1(u8 i) {
  // 取消键 - 直接返回主界面
  if (i == 1) {
    menu_level = 0;
    os_delete_task(TASK_ALARM);
    os_create_task(TASK_MENUS);
  }

  // 确认键
  else if (i == 2) {
    // 进入闹钟设置
    if (alarm_menu_no == 0) {
      menu_level = 2;
      os_send_signal(TASK_ALARM);
    }

    // 开关闹钟
    else if (alarm_menu_no == 1) {
      alarm_enable = alarm_enable ? 0 : 1;
      alarm_enable_changed = 1;
      os_send_signal(TASK_ALARM);
    }

  }

  // +键 指针向上移动
  else if (i == 3) {
    if (alarm_menu_no == 0)
      return;
    alarm_menu_no--;
    // alarm_menu_no = CLIP(alarm_menu_no, 0, 1);
    os_send_signal(TASK_ALARM);
  }

  // -键 指针向下移动
  else if (i == 4) {
    if (alarm_menu_no == 1)
      return;
    alarm_menu_no++;
    // alarm_menu_no = CLIP(alarm_menu_no, 0, 1);
    os_send_signal(TASK_ALARM);
  }
}

/* 闹钟二级子菜单界面按键控制 */
void alarm_control_2(u8 i) {
  // 闹钟保存成功，按任意键退出
  if (alarm_menu_no == 2) {
    alarm_enable = 1;
    alarm_enable_changed = 1;
    menu_level = 1;
    os_send_signal(TASK_ALARM);
    return;
  }

  // 取消键 - 直接返回上一级菜单
  if (i == 1) {
    menu_level = 1;
    os_send_signal(TASK_ALARM);
  }

  // 确认键 - 保存闹钟设置
  else if (i == 2) {
    // 移动修改的时间指针
    alarm_menu_no++;

    os_send_signal(TASK_ALARM);
  }

  // +键 时间+1
  else if (i == 3) {
    if (alarm_menu_no == 0) {
      LIMIT_VALUE_CHANGE(a_temp.hour, 0, 23, 1)
      // a_temp.hour++;
      // if (a_temp.hour > 23)
      //   a_temp.hour = 0;

      os_send_signal(TASK_ALARM);
    }

    else if (alarm_menu_no == 1) {
      // a_temp.minute++;
      // if (a_temp.minute > 59)
      //   a_temp.minute = 0;
      LIMIT_VALUE_CHANGE(a_temp.minute, 0, 59, 1)
      os_send_signal(TASK_ALARM);
    }
  }

  // -键 时间-1
  else if (i == 4) {
    if (alarm_menu_no == 0) {
      LIMIT_VALUE_CHANGE(a_temp.hour, 0, 23, -1)

      // a_temp.hour--;
      // if (a_temp.hour < 0)
      //   a_temp.hour = 23;

      os_send_signal(TASK_ALARM);
    }

    else if (alarm_menu_no == 1) {
      // a_temp.minute--;
      // if (a_temp.minute < 0)
      //   a_temp.minute = 59;
      LIMIT_VALUE_CHANGE(a_temp.minute, 0, 59, -1)

      os_send_signal(TASK_ALARM);
    }
  }
}

/* 闹钟设置界面按键控制 */
void alarm_control(u8 i) {
  if (menu_level == 1) {
    alarm_control_1(i);
  }

  else if (menu_level == 2) {
    alarm_control_2(i);
  }
}

/* 游戏一级子菜单界面按键控制 */
void game_control_1(u8 i, u8 key_state) {
  // printf("key_state: %#x\n", (int)key_state);
  // 如果退出游戏，按任意键退出
  if (is_game == 0) {
    menu_level = 0;
    os_create_task(TASK_MENUS);
    Buzzer_close();
    os_delete_task(TASK_GAME);
    os_delete_task(TASK_BGM);
    return;
  }

  if (key_state == 0) {
    is_game = 0;
  }
  // 取消键 - 左移
  if (i == 1) {
    move = 1;
  }

  // 确认键 - 右移
  else if (i == 2) {
    move = 2;
  }

  // +键 上移
  else if (i == 3) {
    move = 3;
  }

  // -键 下移
  else if (i == 4) {
    move = 4;
  }

  os_send_signal(TASK_GAME);
}

/* 游戏设置界面按键控制 */
void game_control(u8 i, u8 key_state) {
  if (menu_level == 1) {
    game_control_1(i, key_state);
  }
}

/* 计步器一级子菜单界面按键控制 */
void pedometer_control_1(u8 i) {
  // 取消键 - 直接返回主界面
  if (i == 1) {
    menu_level = 0;
  }
}

/* 计步器设置界面按键控制 */
void pedometer_control(u8 i) {
  if (menu_level == 1) {
    pedometer_control_1(i);
  }
}

/* 蓝牙一级子菜单界面按键控制 */
void bluetooth_control_1(u8 i) {
  // 取消键 - 直接返回主界面
  if (i == 1) {
    menu_level = 0;
  }
}

/* 蓝牙设置界面按键控制 */
void bluetooth_control(u8 i) {
  if (menu_level == 1) {
    bluetooth_control_1(i);
  }
}

/* 温湿度一级子菜单界面按键控制 */
void dht_control_1(u8 i) {
  // 取消键 - 直接返回主界面
  if (i == 1) {
    menu_level = 0;

    os_create_task(TASK_MENUS);
    os_delete_task(TASK_DHT);
  }
}

/* 温湿度界面按键控制 */
void dht_control(u8 i) {
  if (menu_level == 1) {
    dht_control_1(i);
  }
}

/* 设置时间界面按键控制*/
void set_time_control(u8 i) {
  char n;
  // 时间保存成功，按任意键退出
  if (time_menu_no == 7) {
    menu_level = 0;
    os_create_task(TASK_MENUS);
    os_delete_task(TASK_SET_TIME);
    return;
  }

  // 取消键 - 直接返回主界面
  if (i == 1) {
    menu_level = 0;
    os_create_task(TASK_MENUS);
    os_delete_task(TASK_SET_TIME);
    return;
  }

  // 确认键 - 保存时间设置
  if (i == 2) {
    time_menu_no++;
    os_send_signal(TASK_SET_TIME);
    return;
  }

  // +键 时间+1
  if (i == 3) {
    n = 1;
    // -键 时间-1
  } else if (i == 4) {
    n = -1;
  }

  if (time_menu_no == 0) {
    LIMIT_VALUE_CHANGE(t.year, 0, 9999, n)
  }

  else if (time_menu_no == 1) {
    LIMIT_VALUE_CHANGE(t.month, 1, 12, n)
  }

  else if (time_menu_no == 2) {
    LIMIT_VALUE_CHANGE(t.day, 1, 31, n)
  }

  else if (time_menu_no == 3) {
    LIMIT_VALUE_CHANGE(t.week, 0, 6, n)
  }

  else if (time_menu_no == 4) {
    LIMIT_VALUE_CHANGE(t.hour, 0, 23, n)
  }

  else if (time_menu_no == 5) {
    LIMIT_VALUE_CHANGE(t.minute, 0, 59, n)
  }

  else if (time_menu_no == 6) {
    LIMIT_VALUE_CHANGE(t.second, 0, 59, n)
  }

  os_send_signal(TASK_SET_TIME);
}

/* 倒计时界面按键控制*/
void countdown_control(i) {
  // 取消键 - 退出界面
  if (i == 1) {
    menu_level = 0;
    os_create_task(TASK_MENUS);
    os_delete_task(TASK_COUNTDOWN);
  }

  // 确认键 - 开始倒计时
  else if (i == 2) {
    timer_set = ENABLE;
    timer_enable = ENABLE;
    os_send_signal(TASK_COUNTDOWN);
  }
}

void music_control(u8 i) {
  if (is_music_play == FALSE) {
    // 取消键 - 退出界面
    if (i == 1) {
      menu_level = 0;
      os_create_task(TASK_MENUS);
      os_delete_task(TASK_MUSIC_MENU);
    }

    // 确认键 - 开始播放音乐
    else if (i == 2) {
      os_create_task(TASK_MUSIC);
      is_music_play = TRUE;
      os_send_signal(TASK_MUSIC_MENU);
    }

    // +键 指针向上移动
    else if (i == 3) {
      if (music_menu_no == 0)
        return;
      music_menu_no--;
      os_send_signal(TASK_MUSIC_MENU);

    }

    // -键 指针向下移动
    else if (i == 4) {
      if (music_menu_no == 1)
        return;
      music_menu_no++;
      os_send_signal(TASK_MUSIC_MENU);
    }

  } else {

    // 取消键 - 停止播放音乐
    if (i == 1) {
      Buzzer_close();
      os_delete_task(TASK_MUSIC);
      is_music_play = FALSE;
      os_send_signal(TASK_MUSIC_MENU);
    }
  }
}

/* 子菜单界面按键控制 */
void submenu_control(u8 i, u8 key_state) {
  // 在闹钟设置界面
  if (menu_no == MENU_ALARM) {
    alarm_control(i);
  }

  // 在游戏界面
  else if (menu_no == MENU_GAME) {
    game_control(i, key_state);
  }

  // 在计步器界面
  else if (menu_no == MENU_PEDOMETER) {
    pedometer_control(i);
  }

  // 在蓝牙界面
  else if (menu_no == MENU_BLUETOOTH) {
    bluetooth_control(i);
  }

  // 在温湿度界面
  else if (menu_no == MENU_DHT) {
    dht_control(i);
  }

  // 在设置时间界面
  else if (menu_no == MENU_SET_TIME) {
    set_time_control(i);
  }

  // 在倒计时界面
  else if (menu_no == MENU_COUNTDOWN) {
    countdown_control(i);
  }

  // 在音乐界面
  else if (menu_no == MENU_MUSIC) {
    music_control(i);
  }
}

/* 按键按下处理 */
void key_down(u8 i, u8 key_stat) {
  // 在菜单界面
  if (menu_level == 0) {
    main_menu_control(i);
    return;
  }

  // 在子菜单界面
  submenu_control(i, key_stat);
}

/* 按键松开处理 */
// void key_up(u8 i) {}

/* 按键任务 */
void task_keys() _task_ TASK_KEYS {
  while (1) {
    get_key_state(key_down, NULL);
    os_wait2(K_TMO, 4);
  }
}